<?php
namespace Center\Controller;
use Think\Controller;
/**
 * 人力信息综合配置平台
 */
class IndexController extends CommonController{
    /* 属性声明 */
    /* 原始配置文件区域 */
    //原始字典文件
    private $dic_file = './Org/Data/init_dic.json';
    //初始化省份数据
    private $province_file = "./Org/Data/Original_Province.json";
    //初始化市区数据
    private $city_file = "./Org/Data/Original_City.json";


    /* 用户配置文件区域 */
    //用户主配置文件
    private $main_conf_file = null;
    //用户顶级子集排序文件
    private $top_sort_conf_file = null;
    //用户自定义字典配置文件
    private $user_dic_file = null;
    //用户自定义省份配置文件
    private $user_pro_file = null;
    
    /* 方法声明 */
    /**
     * 构造方法
     */
    public function __construct() {
        parent::__construct();
        //初始化连接redis数据库
        $this -> redis = connectRedis();

        //初始化全局属性
        $this -> corpid = session('center_login');
        //检测用户配置目录是否存在
        $user_data_dir = './Org/Data/UserData';
        if(!is_dir($user_data_dir)){
            mkdir($user_data_dir);
        }

        //初始化属性数据
        $this -> main_conf_file     = "./Org/Data/UserData/main_conf/{$this->corpid}_main.conf";
        $this -> top_sort_conf_file = "./Org/Data/UserData/top_sort/".$this -> corpid.'.conf';
        $this -> user_dic_file      = './Org/Data/UserData/dic_conf/'.$this->corpid.'_dic_conf.conf';
        $this -> user_pro_file      = './Org/Data/UserData/province/'.$this->corpid.'_pro_conf.conf';
    }
    
    /**
     * 入口方法 加载配置首页
     */
    public function index(){
        //检测是否存在顶级子集排序配置文件
        if(file_exists($this->top_sort_conf_file)){
            $has_top_conf = true;
        }else{
            $has_top_conf = false;
        }
        //检测是存在主配置文件
        if(file_exists($this->main_conf_file)){
            $has_main_conf = true;
        }else{
            $has_main_conf = false;
        }

        //获取所有顶级子集项
        $top_list = $this -> getToplist($has_top_conf);
        //dump($top_list);exit;
        $this -> assign(array(
            'has_main_conf' => $has_main_conf,
            'top_list' => $top_list,
            'corpid' => $this-> corpid
        ));
        $this -> display();
    }
    
    /**
     * 获取所有顶级子集数据
     * @param boolean $has_top_conf 是否有顶级子集排序自定义配置文件标记
     * @return array
     */
    private function getToplist($has_top_conf){
        $top_file = "./Org/Data/Original_top_list.json";
        $top_list = json_decode(file_get_contents($top_file),true);
        $top_list_keys = array_keys($top_list);
        //检测是否存在用户配置文件
        if($has_top_conf){
            //存在配置文件
            $sort_list = unserialize(file_get_contents($this->top_sort_conf_file));
            $sort_list_keys = array_keys($sort_list);
            //dump($sort_list);exit;
            //判断新的子集文件不在配置文件里,加进配置文件,display默认false
            foreach($top_list as $k=>$v){
                if(!in_array($k,$sort_list_keys)){
                    $sort_list[$k] = $v;
                    $sort_list[$k]['display'] = false;
                }
            }
            //判断配置文件的子集名不存在新的子集文件里就删除配置文件的此子集
            foreach($sort_list as $k=>$v){
                if(!in_array($k,$top_list_keys)){
                    unset($sort_list[$k]);
                }else{
                    $sort_list[$k]['caption'] = $top_list[$k]['caption'];
                    $sort_list[$k]['name'] = $top_list[$k]['name'];
                }
            }
            //dump($sort_list);exit;
            $top_list = $sort_list;
        }else{
            //不存在配置文件   添加display属性
            foreach($top_list as $k => $v){
                $top_list[$k]['display'] = true;
            }
        }
        //dump($top_list);exit;
        return $top_list;
    }
    
    /**
     * 获取指定子集组织数据
     * @param boolean $has_main_conf 是否包含主配置文件
     * @param string $item 子集名称
     */
    private function getInfolist($has_main_conf,$item){
        //获取原始数据
        $ori_data = json_decode(file_get_contents('./Org/Data/Original_name_submodel.json'),true);
        //dump($ori_data);exit;
        //检测是否有主配置文件
        if($has_main_conf){
            //获取主配置文件
            $main_data = unserialize(file_get_contents($this->main_conf_file));
            //dump($main_data);exit;
            //获取原始文件中子集数据
            $ori_subitem_data = $ori_data[$item];
            $ori_list = $ori_subitem_data['sublist'];
            $name_list = array_keys($ori_list);

            //获取配置文件中子集数据
            $conf_subitem_data = $main_data[$item];
            $conf_list = $conf_subitem_data['sublist'];
            //dump($name_list);
            //dump($conf_list);exit;
            //整理显示数据
            $buf = null;
            foreach($conf_list as $k=>$v){
                if(in_array($v,$name_list)){
                    $temp = $ori_list[$v];
                    $temp['display'] = true;
                    $offset = array_search($v,$name_list);
                    unset($name_list[$offset]);
                    $buf[$v] = $temp;
                }
            }
            //追加不显示数据
            foreach($name_list as $k => $v){
                $temp = $ori_list[$v];
                $temp['display'] = false;
                $buf[$v] = $temp;
            }
            $ori_subitem_data['sublist'] =  $buf;
            //dump($ori_subitem_data);exit;
            return $ori_subitem_data;
        }else{
            //不存在主配置文件
            $item = $ori_data[$item];
            //分配显示标记
            $item['display'] = true;
            //分配二级子集是否显示标记
            //原始子集数据
            $ori_sublist = $item['sublist'];
            //用户配置子集
            foreach($ori_sublist as $k => $v){
                $ori_sublist[$k]['display'] = true;
            }
            $item['sublist'] = $ori_sublist;
            return $item;
        }
        
    }
    
    /**
     * post生成顶级子集排序配置文件
     */
    public function sortTop(){
        if(!IS_POST){
            $this -> error('数据缺失!');
        }
        $data = I('post.')['menu'];
        //dump($data);exit;
        //获取原始顶级导航数据
        $ori_top_data = file_get_contents('./Org/Data/Original_top_list.json');
        $ori_top_data = json_decode($ori_top_data,true);
        $buffer = [];
        foreach($data as $k => $v){
            $temp = $ori_top_data[$v];
            $temp['display'] = true;
            $buffer[$v] = $temp;
            unset($ori_top_data[$v]);
        }

        //追加未选中数据
        //dump($ori_top_data);exit;
        foreach($ori_top_data as $k => $v){
            $v['display'] = false;
            $buffer[$k] = $v;
        }
        //dump($buffer);exit;
        $top_conf_dir = "./Org/Data/UserData/top_sort";
        if(!is_dir($top_conf_dir)){
            mkdir($top_conf_dir);
        }
        //存储顶级排序配置文件
        $file = "./Org/Data/UserData/top_sort/".$this -> corpid.'.conf';
        if(file_put_contents($file, serialize($buffer))){
            $this -> success('保存成功!');
        }else{
            $this -> error('保存失败!');
        }
    }
    
    /**
     * post生成主配置文件
     */
    public function createMainConfig(){
        if(!IS_POST){
            $this -> error('缺失参数!');
        }
        $data = I('post.');
        //dump($data);
        $choose_subitem_list = $data['subitem'];
        $choose_subitem_name = $data['item_name'];
        //获取所有原始顶级子集项目
        $ori_top_list = $this -> getToplist();

        $main_conf_dir = "./Org/Data/UserData/main_conf";
        if(!is_dir($main_conf_dir)){
            mkdir($main_conf_dir);
        }
        //检测是否存在主配置文件
        if(file_get_contents($this->main_conf_file)){
            //更改主配置文件对应子集sublitem列表
            $main_data = unserialize(file_get_contents($this->main_conf_file));
            //dump($main_data);
            $main_data[$choose_subitem_name]['sublist'] = $choose_subitem_list;

            $ori_top_list = $main_data;
            //dump($ori_top_list);exit;
        }else{
            $file = "./Org/Data/Original_name_submodel.json";
            $dat = json_decode(file_get_contents($file),true);

            //初始化主配置文件
            foreach($ori_top_list as $k => $v){
                //更改当前配置子集信息
                if($k == $choose_subitem_name){
                    $ori_top_list[$k]['sublist'] = $choose_subitem_list;
                }else{
                    $temp2_name_list = array_keys($dat[$k]['sublist']);
                    $ori_top_list[$k]['sublist'] = $temp2_name_list;
                }
            }
        }
        //dump($ori_top_list[$choose_subitem_name]);exit;
        //生成用户自定义主配置文件
        if(file_put_contents($this->main_conf_file,serialize($ori_top_list))){
            $this -> success('生成配置成功!');
        }else{
            $this -> error('生成配置失败!');
        }
    }
    
    /**
     * 获取字典信息
     */
    public function getDic(){
        $data = I('get.');
        //检测是存在主配置文件
        if(file_exists($this->main_conf_file)){
            $has_main_conf = true;
        }else{
            $has_main_conf = false;
        }
        $this -> assign('has_main_conf',$has_main_conf);
        //转换数据格式
        $dic_id = $data['id'];
        $caption = $data['name'];

        //获取字典json数据
        $dic_data = json_decode(file_get_contents($this->dic_file),true)['CASC.HR.DICT.ALL'];

        $dic_list = $dic_data[$dic_id];
        //dump($dic_list);exit;
        //检测是否有内容
        if(empty($dic_list['subitem'])){
            $this -> error('无字典信息项!');
            exit;
        }
        //检测是否存在字典配置文件
        if(file_exists($this->user_dic_file)){
            $user_data = json_decode(file_get_contents($this->user_dic_file),true)[$dic_id];
            $dic_list = $user_data;
        }
        $this -> assign('dic',$dic_list);
        $this -> assign('name',$dic_id);
        $this -> display();
        exit;
    }
    
    /**
     * 保存字典配置信息
     */
    public function saveDic(){
        if(!IS_POST){
            $this -> error('参数缺失!');
        }

        //post数据提取
        $data = I('post.');
        $dic_name = $data['dic_name'];
        $dic_list = $data['dic_list'];
        $dic_data = $dic_list;

        //读取原始字典文件
        $ori_dic_data = json_decode(file_get_contents($this->dic_file),true)['CASC.HR.DICT.ALL'];
        if(!$cur_dic_data = $ori_dic_data[$dic_name]){
            $this -> error('数据处理异常!');
        }
//        dump($dic_data);
//        dump($cur_dic_data);exit;
        $cur_subitem = $cur_dic_data['subitem'];

        //匹配筛选
        $buffer_list = [];
        $val_list = array_column($cur_subitem,'value');
        foreach($dic_data as $k => $v){
            $index = array_search($v,$val_list);
            $cur_subitem[$index]['display'] = true;
            $buffer_list[] = $cur_subitem[$index];
            unset($cur_subitem[$index]);
        }
        //补充余下未选中字典数据
        if(!empty($cur_subitem)){
            foreach($cur_subitem as $k => $v){
                $v['display'] = false;
                $buffer_list[] = $v;
            }
        }
        //数据回填
        $cur_dic_data['subitem'] = $buffer_list;
        $ori_dic_data[$dic_name] = $cur_dic_data;
        //清除前台字典文件
        $this -> dic_file = './Org/Data/Dic_js/'.$this->corpid.'_dic.js';

        unlink($this->dic_file);

        
        //检测目录是否存在
        $dic_conf_dir = "./Org/Data/UserData/dic_conf";
        if(!is_dir($dic_conf_dir)){
            mkdir($dic_conf_dir);
        }
        if(file_put_contents($this->user_dic_file,json_encode($ori_dic_data))){
            $this -> success('配置字典成功!');
        }else{
            $this -> error('配置字典失败!');
        }
    }
    
    /**
     * 加载info统计模块
     */
    public function info(){
        $this -> display();
    }
    
    /**
     * 加载子集配置模块
     */
    public function item(){
        $data = I('get.');
        $item_name = $data['name'];
        //检测是存在主配置文件
        if(file_exists($this->main_conf_file)){
            $has_main_conf = true;
        }else{
            $has_main_conf = false;
        }
        //获取所有子集数据
        $info_list = $this -> getInfolist($has_main_conf,$item_name);
        //dump($info_list);exit;
        $this -> assign(array(
            'has_main_conf' => $has_main_conf,
            'info_list' => $info_list,
            'name' => $item_name
        ));
        $this -> display();
    }
    
    /**
     * 顶级菜单排序视图显示
     */
    public function sortTopMenu(){
        //检测是否存在顶级子集排序配置文件
        if(file_exists($this->top_sort_conf_file)){
            $has_top_conf = true;
        }else{
            $has_top_conf = false;
        }
        //获取所有顶级子集项
        $top_list = $this -> getToplist($has_top_conf);
        //dump($top_list);exit;
        $this -> assign('top_list',$top_list);
        $this -> display();
    }
    
    /**
     * 修改授权用户密码
     */
    public function passwd(){
        $this -> error('该功能暂未开放!');
    }
    
    /**
     * 初始化配置操作
     */
    public function resetConf(){
        if(!IS_AJAX){
            $this -> ajaxReturn(false);
        }
        $post_data = I('post.');
        $pwd = $post_data['password'];
        //验证授权密码
        if($this->userinfo[session('center_login')]!=$pwd){
            $this ->ajaxReturn(false);
        }
        //执行删除个性化配置操作
        //自定义顶级导航配置
        $corpid = session('center_login');
        $top_file = "./Org/Data/UserData/top_sort/{$corpid}.conf";
        //主配置文件
        $main_file = "./Org/Data/UserData/main_conf/{$corpid}_main.conf";
        //自定义字典配置文件
        $dic_file = "./Org/Data/UserData/dic_conf/{$corpid}_dic_conf.conf";
        //自定义省份字典文件
        $pro_file = "./Org/Data/UserData/province/{$corpid}_pro_conf.conf";
        unlink($top_file);
        unlink($main_file);
        unlink($dic_file);
        unlink($pro_file);
        $this ->ajaxReturn(true);
    }


}